from http.client import responses

from django.shortcuts import render
from django.http import JsonResponse
# Create your views here.
from django.views import  View

# QQ登录
from QQLoginTool.QQtool import OAuthQQ

class QQLoginUrlView(View):

    def get(self, request):
        """
            client_id = appid
            client_secret = app_key
            redirect_uri = 用户同意登录之后,跳转的页面
            state  随便写
        """
        qq = OAuthQQ(client_id="102632482",
                     client_secret="uhMtDKH5kDWfeVCf",
                     redirect_uri="http://www.mfy.site:8080/oauth_callback.html",
                     state="xxxx")

        # 调用对象的方法生成跳转链接
        qq_login_url = qq.get_qq_url()

        # 返回响应
        return JsonResponse({"code":0,"errmsg":"ok","login_url":qq_login_url})

"""
    需求: 获取code,通过code换取token，再通过token换取openid
    
    前端: 应该获取 用户同意登录的code,把这个code发送给后端
    
    后端:
        请求:        获取code
    业务逻辑:        通过code获取token,在通过token换取openid
                    根据openid进行判断,如果没有绑定过,则需要绑定,如果绑定过,则直接登录
        响应:
        路由:        GET oauth_callback/?code= xxx
        步骤: 
                    1. 获取code
                    2. 通过code换取token
                    3. 再通过token换取openid
                    4. 根据openid进行判断
                    5. 如果没有绑定过,则需要绑定
                    6. 如果绑定过,则直接登录
"""
from apps.oauth.models import QAuthQQUser
from django.contrib.auth import login, authenticate, logout
class QauthQQView(View):

    def get(self, request):

        code = request.GET.get('code')

        # code -> token -> openid

        if code is None:
            return JsonResponse({"code":400,"errmsg":"参数不全"})

        # 通过code换取token
        qq = OAuthQQ(client_id="102632482",
                    client_secret="uhMtDKH5kDWfeVCf",
                    redirect_uri="http://www.mfy.site:8080/oauth_callback.html",
                    state="xxxx")

        token = qq.get_access_token(code)

        # 再通过token换取openid
        openid = qq.get_open_id(token)

        # 根据openid进行判断
        try:
            qquser = QAuthQQUser.objects.get(openid=openid)

        except QAuthQQUser.DoesNotExist:

            # 如果没有绑定过,则需要绑定
            response =  JsonResponse({"code":400,"access_token":openid})
            return response
        else:
            # 如果openid存在
            # 如果绑定过,则直接登录
            # 设置session
            login(request,qquser.user)
            # 设置cookie
            response = JsonResponse({"code":0,"errmsg":"ok"})

            response.set_cookie('username',qquer.user.username)

            return response

    def post(self, request):
        # 1. 接收请求
        data = json.loads(request.body.decode())

        # 2. 获取请求参数 openid
        mobile = data.get('mobile')
        password = data.get('password')
        sms_code = data.get('sms_code')
        openid= data.get('openid')
        # 需要对数据进行验证(省略)

        # 3. 根据手机号进行用户信息的查询
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            # 手机号不存在,新增用户
            user=User.objects.create_user(username=mobile,mobile=mobile,password=password)
        else:
            # 手机号存在
            # 4.查询到用户手机号已经注册了, 就可以直接保持(绑定) 用户和openid信息
            # 检测密码
            if not user.check_password(password):
                return JsonResponse({"code":400,"errmsg":"账号或密码不正确"})

        QAuthQQUser.objects.create(user=user,openid=openid)
        # 6.完成状态保持
        login(request,user)
        # 7.返回响应
        response = JsonResponse({"code":0,"errmsg":"ok"})

        response.set_cookie('username',user.username)
        return response

"""
    需求: 绑定账号信息
        QQ(openid) 和 美多的账号信息
        
    前端:
        当用户输入 手机号,密码,短信验证码之后就发送axios请求.请求需要携带 mobile,password,sms_code,access_token(openid)
        
    后端:
    
        请求: 接收请求,获取请求参数
     业务逻辑: 绑定,完成状态保持
        响应: 返回code=0 跳转到首页
        路由: POST oauth_callback/
        
        步骤:
            1. 接收请求
            2. 获取请求参数
            3. 根据手机号进行用户信息的查询
            4. 查询到用户手机号已经注册了,就可以直接保持(绑定) 用户和openid信息
            5. 查询到用户手机号已经注册了
            4. 完成状态保持
            5. 返回响应
"""


